package com.woniuxy.microseckillserver.configure;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: 刘康
 * @Date: 2021/1/23 16:20
 * @Description:
 */
@Configuration
public class RabbitMQConfiguration {

    /**
     * 直接路由交换机
     * @return
     */
    @Bean
    public DirectExchange directExchange(){
        /*第一个参数：交换机名称;
         * 第二个参数：持久化支持;
         * 第三个参数：没有连接访问该交换机 ，不删除该交换机*/
        return new DirectExchange("order.exchange",false,false);
    }





    /**
     * 直接交换机
     * @return
     */
    @Bean
    public DirectExchange orderExchange(){
        /*第一个参数：交换机名称;
         * 第二个参数：持久化支持;
         * 第三个参数：没有连接访问该交换机 ，不删除该交换机*/
        return new DirectExchange(
                "order.exchange",false,false);
    }
    @Bean
    public Queue orderQueue(){
        return new Queue("order.queue",false);
    }
    /**
     * 将队列以及交换机进行绑定
     * @return
     */
    @Bean
    public Binding orderBindingExchange(){
        return BindingBuilder.bind(orderQueue()).to(orderExchange()).with("order.info");
    }





    /**
     * 支付交换机
     * @return
     */
    @Bean
    public DirectExchange payExchange(){
        return new DirectExchange("pay.exchange");
    }
    /**
     * 延迟队列
     * @return
     */
    @Bean
    public Queue delayQueue(){
        Map<String,Object> args = new HashMap();
        //定义一个死信交换机
        args.put("x-dead-letter-exchange","pay.dle.exchange");
        //绑定在死信交换机上的路由key
        args.put("x-dead-letter-routing-key","pay.dle.routing.key");
        //你可以自己修改为15分钟（单位是毫秒） 消息在队列中，可以延迟多久
        args.put("x-message-ttl",1000*60*10);
        return new Queue("delayQueue",false,false,false,args);
    }
    /**
     * 绑定延迟队列，以及支付交换机
     * @return
     */
    @Bean
    public Binding delayPayExchange(){
        return BindingBuilder.bind(delayQueue()).to(payExchange()).with("pay.info.routing.key");
    }





    /**
     * 死信交换机
     * @return
     */
    @Bean
    public DirectExchange dleExchange(){
        return new DirectExchange("pay.dle.exchange");
    }
    /**
     * 死信数据接收队列
     * 该队列中的数据，都来自于死信交换机
     * @return
     */
    @Bean
    public Queue dleReceiveQueue(){
        return new Queue("dleReceiveQueue");
    }
    /**
     * 死信交换机 数据出口绑定
     * @return
     */
    @Bean
    public Binding dleExchangeBinding(){
        return BindingBuilder.bind(dleReceiveQueue()).to(dleExchange()).with("pay.dle.routing.key");
    }

}
